/**********作用域**********/
//作用域链[[scope]]
//AO GO 联系 （执行期上下文）
//[[scope]]存放运行期上下文集合（AO  GO）
//函数定义时 name.[[scope]] 最高位(0)存放 GO{}(所在环境)
//函数执行时 name.[[scope]] 最高位(0)存放 AO{}
//                         下一位(1)存放 GO{}
//执行完 销毁自己的执行上下文
function a() {
  function b() {
    var b = 234;
  }
  var a = 123;
  b();
}
a();
//a函数定义时 当前环境为window，a.[[scope]]最高位存放GO(window)（全局的执行上下文）;
//a函数执行时 a.[[scope]] 最高位存放AO（本身的执行上下文）；
//                       下一位存放GO；
//b函数定义时 当前环境为a函数，b.[[scope]]存放a.[[scope]]（即a的AO和GO）
//b函数执行时 b.[[scope]] 将自己生成的AO 存入最高位

/**********  this指向  **********/

// 作为对象属性被调用
var global = "我是全局的global";

var test1 = {
  global: "我是test里面的global",
  show() {
    console.log(this.global);
  },
};
test1.show(); //打印 "我是test里面的global"

//作为普通函数被调用  严格模式下 this 指向 undefined

function test2() {
  let global = "我是test函数里面的global";
  console.log(this.global);
}
test2(); //打印 "我是test里面的global"

// 在构造函数里
//原理 1.函数体最前面 var this = {}
//     2.赋值
//     3.return this(可以手动更改返回一个object类型的对象)
function Father() {
  // var this = {}
  this.name = "huangyue";
  this.age = "20";
  // return this
}

// 可以通过bind apply call 改变this的指向
// 箭头函数没有this 他继承当前环境的this
